package pe.gob.foncodes.ssa.web.controller;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.apache.log4j.Logger;

import pe.gob.foncodes.ssa.bs.common.controller.GenericController;
import pe.gob.foncodes.ssa.bs.common.util.Constante;
import pe.gob.foncodes.ssa.bs.common.util.FechaUtil;
import pe.gob.foncodes.ssa.bs.common.util.ServiceException;
import pe.gob.foncodes.ssa.bs.seguridad.domain.General;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Zonal;
import pe.gob.foncodes.ssa.web.beans.UsuarioBean;
import pe.gob.foncodes.ssa.web.util.Impresion;

public class ReporteUsuarioController extends GenericController {

    protected static Logger log = Logger.getLogger(ReporteUsuarioController.class);
    private String busCodUsuario;
    private String busNomUsuario;
    private String busTipoUsuario;
    private String busIdUnidadTerritorial;
    private String busActivo;
    private boolean busBloqueado;
    private java.util.Date busFechaDesde;
    private java.util.Date busFechaHasta;
    private java.util.Date txtToday;
    private List<General> lstTipoUsuario;
    private List<Zonal> lstUnidadTerritorial;
    private List<UsuarioBean> lstUsuarios;

    public Date getTxtToday() {
        return txtToday;
    }

    public void setTxtToday(Date txtToday) {
        this.txtToday = txtToday;
    }

    @Override
    public void init() {
        this.busBloqueado = false;
        this.busActivo = null;
        lstUsuarios = new ArrayList<UsuarioBean>();
        this.setBusBloqueado(false);
        Calendar c = new GregorianCalendar();
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        this.txtToday = c.getTime();
    }

    @Override
    public void search(ActionEvent event) throws Exception {
        log.info("Ejecutando filtro reporte de usuarios");
        String formato = "dd/MM/yyyy";
        this.busCodUsuario = (this.busCodUsuario == null) ? null : this.busCodUsuario.trim().toUpperCase();
        this.busNomUsuario = (this.busNomUsuario == null) ? null : this.busNomUsuario.trim().toUpperCase();
        String strCodUsuario = (this.busCodUsuario == null) ? null : "%" + this.busCodUsuario + "%";
        String strNomUsuario = (this.busNomUsuario == null) ? null : "%" + this.busNomUsuario + "%";
        String strBloqueado = (busBloqueado) ? Constante.ESTADO_ACTIVO : null;
        java.sql.Date dFechaInicio = null;
        java.sql.Date dFechaFin = null;
        Calendar c = new GregorianCalendar();
        if (this.busFechaDesde != null) {
            dFechaInicio = new java.sql.Date(busFechaDesde.getTime());
            c.setTime(this.busFechaDesde);
            c.set(Calendar.HOUR_OF_DAY, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            this.busFechaDesde = c.getTime();
            dFechaInicio = new java.sql.Date(this.busFechaDesde.getTime());
        }

        if (this.busFechaHasta != null) {
            dFechaFin = new java.sql.Date(busFechaHasta.getTime());
            c.setTime(this.busFechaHasta);
            c.set(Calendar.HOUR_OF_DAY, 23);
            c.set(Calendar.MINUTE, 59);
            c.set(Calendar.SECOND, 59);
            this.busFechaHasta = c.getTime();
            dFechaFin = new java.sql.Date(this.busFechaHasta.getTime());
        }

        List<Object[]> olstUsuarios = getService().findByNamedQuery("Usuario.findByReporte",
                new Object[]{this.busActivo, strBloqueado, strCodUsuario, strNomUsuario, this.busTipoUsuario, this.busIdUnidadTerritorial, dFechaInicio, dFechaFin});
        this.lstUsuarios = new ArrayList<UsuarioBean>();
        String tipUsuario = "";
        for (Object[] obj : olstUsuarios) {
            UsuarioBean oUsuario = new UsuarioBean();
            oUsuario.setCOD_USUARIO((String) obj[0]);
            oUsuario.setTXT_APELLIDOS_NOMBRES((String) obj[1]);
            tipUsuario = (String) obj[2];
            oUsuario.setTXT_TIPO_USUARIO(tipUsuario.equals("Interno") ? "I" : "E");
            oUsuario.setTXT_ZONAL((String) obj[3]);
            oUsuario.setFEC_REGISTRO((new SimpleDateFormat(formato)).format(obj[4]));
            oUsuario.setFLG_ACTIVO((String) obj[5]);
            oUsuario.setFLG_BLOQUEADO((String) obj[6]);
            oUsuario.setFLG_CADUCIDAD_CLAVE((String) obj[7]);
            oUsuario.setTXT_CORREO_ELECTRONICO1((String) obj[8]);
            oUsuario.setTXT_CORREO_ELECTRONICO2((String) obj[9]);
            this.lstUsuarios.add(oUsuario);
        }
    }

    public void limpiar() {
        this.busCodUsuario = "";
        this.busNomUsuario = "";
        this.busActivo = null;
        this.busTipoUsuario = "";
        this.busIdUnidadTerritorial = "";
        this.busBloqueado = false;
        this.busFechaDesde = null;
        this.busFechaHasta = null;

        this.lstUsuarios = new ArrayList<UsuarioBean>();
    }

    public void print(int tipo) {
        try {
            Collection col = new ArrayList();
            for (UsuarioBean oUsuario : this.lstUsuarios) {
                col.add(oUsuario);
            }
            String filtros = "";
            if (this.busCodUsuario != null && !this.busCodUsuario.equals("")) {
                filtros = String.format("%s %s , ", "Código usuario:", this.busCodUsuario);
            }
            if (this.busNomUsuario != null && !this.busNomUsuario.equals("")) {
                filtros = String.format("%s %s %s , ", filtros, "Nombre Usuario:", this.busNomUsuario);
            }

            if (this.busTipoUsuario != null && !this.busTipoUsuario.equals("")) {
                General oTipoUsuario = (General) getService().findByNamedQuery("General.findByTxtDominioTxtValor", new Object[]{"TIPO_USUARIO", this.busTipoUsuario}).get(0);
                filtros = String.format("%s %s %s, ", filtros, "Tipo de Usuario: ", oTipoUsuario.getTxtParametro());
            } else {
                filtros = String.format("%s %s , ", filtros, "Tipo de Usuario: (Todos)");
            }

            if (this.busIdUnidadTerritorial != null && !this.busIdUnidadTerritorial.equals("")) {
                Zonal oZonal = (Zonal) getService().findByNamedQuery("Zonal.findByCodZonal", new Object[]{this.busIdUnidadTerritorial}).get(0);
                filtros = String.format("%s %s %s, ", filtros, "Unidad Territorial:", oZonal.getTxtZonal());
            } else {
                filtros = String.format("%s %s , ", filtros, "Unidad Territorial: (Todas)");
            }

            if (this.busFechaDesde != null && this.busFechaHasta != null) {
                filtros = String.format("%s Fecha desde %s al %s , ", filtros, (new SimpleDateFormat("dd/MM/yyyy")).format(this.busFechaDesde), (new SimpleDateFormat("dd/MM/yyyy")).format(this.busFechaHasta));
            }

            if (this.busActivo != null && this.busActivo.equals(Constante.ESTADO_ACTIVO)) {
                filtros = String.format("%s %s , ", filtros, "Usuarios Activos");
            } else if (this.busActivo != null && this.busActivo.equals(Constante.ESTADO_INACTIVO)) {
                filtros = String.format("%s %s , ", filtros, "Usuarios Inactivos");
            } else {
                filtros = String.format("%s %s , ", filtros, "Usuarios: (Todos)");
            }

            if (this.busBloqueado) {
                filtros = String.format("%s %s , ", filtros, "Usuarios Bloqueados:");
            }

            if (filtros == null || filtros.equals("")) {
                filtros = "(Todos los registros)";
            } else {
                if (filtros.substring(filtros.length() - 2).trim().equals(",")) {
                    String tmp = "";
                    tmp = filtros.substring(0, filtros.length() - 2);
                    filtros = tmp;
                }
            }

            Impresion imprimir = new Impresion();
            if (tipo == 0) {
                imprimir.imprimirListado("ssa_rpt_usuarios_listado", col, filtros.toString());
            } else if (tipo == 1) {
                imprimir.exportarExcel("ssa_rpt_usuarios_listado_excel", col, filtros.toString());
            }
        } catch (Exception ex) {
            log.error(ex);
        } finally {
            FacesContext.getCurrentInstance().responseComplete();
        }
    }

    public String getBusCodUsuario() {
        return busCodUsuario;
    }

    public void setBusCodUsuario(String busCodUsuario) {
        this.busCodUsuario = busCodUsuario;
    }

    public java.util.Date getBusFechaDesde() {
        return busFechaDesde;
    }

    public void setBusFechaDesde(java.util.Date busFechaDesde) {
        this.busFechaDesde = busFechaDesde;
    }

    public java.util.Date getBusFechaHasta() {
        return busFechaHasta;
    }

    public void setBusFechaHasta(java.util.Date busFechaHasta) {
        this.busFechaHasta = busFechaHasta;
    }

    public String getBusIdUnidadTerritorial() {
        return busIdUnidadTerritorial;
    }

    public void setBusIdUnidadTerritorial(String busIdUnidadTerritorial) {
        this.busIdUnidadTerritorial = busIdUnidadTerritorial;
    }

    public String getBusNomUsuario() {
        return busNomUsuario;
    }

    public void setBusNomUsuario(String busNomUsuario) {
        this.busNomUsuario = busNomUsuario;
    }

    public String getBusTipoUsuario() {
        return busTipoUsuario;
    }

    public void setBusTipoUsuario(String busTipoUsuario) {
        this.busTipoUsuario = busTipoUsuario;
    }

    public List<General> getLstTipoUsuario() throws ServiceException {
        this.lstTipoUsuario = getService().findByNamedQuery("General.findByTxtDominioEstado", new Object[]{"TIPO_USUARIO", "1"});
        return lstTipoUsuario;
    }

    public List<UsuarioBean> getLstUsuarios() {
        return lstUsuarios;
    }

    public void setLstUsuarios(List<UsuarioBean> lstUsuarios) {
        this.lstUsuarios = lstUsuarios;
    }

    public boolean isBusBloqueado() {
        return busBloqueado;
    }

    public void setBusBloqueado(boolean busBloqueado) {
        this.busBloqueado = busBloqueado;
    }

    public String getBusActivo() {
        return busActivo;
    }

    public void setBusActivo(String busActivo) {
        this.busActivo = busActivo;
    }

    public List<Zonal> getLstUnidadTerritorial() throws ServiceException {
        this.lstUnidadTerritorial = getService().findByNamedQuery("Zonal.findAll");
        return lstUnidadTerritorial;
    }

    public void setLstUnidadTerritorial(List<Zonal> lstUnidadTerritorial) {
        this.lstUnidadTerritorial = lstUnidadTerritorial;
    }
}